#coding=utf-8
#!/usr/bin/python
"""
<python select 接收到 signal>

select
    windows  非阻塞select  还是是不行
    Linux 可以


Linux 也没有 多线程 (不能同时处理)

    socket不能重用   有 TIME_WAIT 就无法再用

thread.start_new_thread(Communicate,(s,))  //???

#     cd /d D:\python26 
#     python.exe D:\py\demo\sock_s.py

#       python.exe  .\dev_test\sock_s.py

"""
import os,sys,time

# 不能 做多线程
import socket 
#信号处理
import signal

#都是内设 模块
import SocketServer,threading,select


############### 信号
def signal_do(signum, frame):
    u" 信号处理 "
    print "signal is ",signum
    print frame
    #有线程 在程序没法正常退出
    #exit
    exit(0)
    

signal.signal(signal.SIGINT,signal_do)

################# 线程
global  mutex 
# 创建锁 一把锁
mutex = threading.Lock()
class thr_test(threading.Thread):
    def __init__(self, connection):
        threading.Thread.__init__(self)
        self.connection = connection
    
    def run(self):
        u" 连接处理 线程实际工作"
        global mutex
        threadname = threading.currentThread().getName()
        print threadname

       #获取全局锁
        mutex.acquire()
        # -----------操作
        #合理数据
        while True:  
            buf = self.connection.recv(1024)  
            #收到 空格 退出
            if  buf == ' ':
                break
            #send和recv方法(发送，接受)
            send_str = u'welcome to server!\r\n'+str(len(buf)).encode('utf8')+u'\r\n'+str(buf).encode('utf8') 
            print send_str
            self.connection.send(send_str)

        self.connection.close() 
        #释放全局锁
        mutex.release()



if __name__ == '__main__':  
    lis_add = '0.0.0.0'
    lis_port = 800
    
    # AF_INET(Internet地址 ) 和 AF_UNIX(SOCK的文件)
    # SOCK_STREAM(流套接字)  和 SOCK_DGRAM(数据报套接字)
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  
    sock.bind((lis_add, lis_port)) 
     
    #最多允许 3 个客户连接到服务器
    sock.listen(2)  
    #线程容器 
    threads = []    

    while True:  

        print '--------------loop wait--------------'
        # sock 等待连接  
        in_fds,out_fds,err_fds = select.select([sock],[],[])
        print '--------------loop start--------------'
        #accept方法等待客户请求一个连接
        #  连入就分开了
        connection,address = sock.accept()  
        print address
        thr_obj = thr_test(connection)  
        thr_obj.start()
        
        threads.append(thr_obj)
        #thr_obj.join()  


        
    #关闭网络    
    sock.close()
    print 'exit'
    time.sleep(4)
    print __file__ ,':the end'
    sys.exit()
            